/*!
 * \file jxbankagree_core.h
 *
 * \brief JXBANKAGREE模块主文件
 *
 * All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.
 *
 * \version 1.0
 * \author songbb
 * \date 2017/04/20
 *
 */

#ifndef __JXBANKAGREE_CORE_H_
#define __JXBANKAGREE_CORE_H_

#include "frlist.h"
#include "frhash2.h"
#include "frstr.h"

#include "conntrack.h"
#include "module.h"
#include "frbyte_buffer.h"

/*! @brief JXBANKAGREE协议通用包头 */
typedef struct __st_jxbankagree_header
{
    unsigned int ui_pkt_len;            //!< 消息体长度(包含消息头)
} Jxbankagree_header;

/*! @brief L7session_te 用于存放JXBANKAGREE私有的session数据，对应L7_session的p_session_private变量 */
typedef struct __st_L7session_jxbankagree
{
} L7session_jxbankagree;

/*! @brief 分片的状态 */
typedef enum __em_fragment_state {
    APM_JXBANKAGREE_FRAGMENT_INIT,                     //!< 初始化
    APM_JXBANKAGREE_FRAGMENT_NEED_NEXT_REQ_PACKET,     //!< 需要下一个请求包
    APM_JXBANKAGREE_FRAGMENT_NEED_NEXT_RESP_PACKET     //!< 需要下一个响应包
} Jxbankagree_fragment_state;

/*! @brief JXBANKAGREE数据包 */
typedef struct __st_L7_jxbankagree_packet
{
    Jxbankagree_header st_jxbankagree_header;           //!< 包头
    Jxbankagree_fragment_state fragment_state;      //!< 当前的分片状态
    Frbyte_Packet *p_st_packet;             //!< 组包完成的数据
    unsigned int ui_len_to_read;            //!< 还需要从下一个payload中读取多少个字节
    struct timeval st_timestamp_first;      //!< 第一个请求的分片包的时间
    struct timeval st_timestamp_last;       //!< 最后一个请求的分片包的时间
    int i_is_req;                           //!< 是否是请求包
} L7_jxbankagree_packet;

/*! @brief JXBANKAGREE私有结构体 */
typedef struct __st_L7session_jxbankagree_private
{
    L7session_jxbankagree *p_st_sess;            //!< session数据
    L7_jxbankagree_packet *p_st_jxbankagree_packet;  //!< 当前处理中的JXBANKAGREE数据包
    L7_session *p_st_session;                //!< 指向父级的L7_session结构体
    Frlist_header *p_report_comm;            //!< 用于临时存储report的公共部分数据
    Frlist_header *p_report_req;             //!< 用于临时存储report的请求部分数据
    struct timeval st_req_end_timestamp;     //!< 请求的结束时间戳
} L7session_jxbankagree_private;

/*!
 * 判断当前数据链路是否是JXBANKAGREE协议的
 *
 * \param p_st_conn        (ct信息)
 * \param p_st_packet      (协议分析入力数据)
 *
 * \return 参照module.h中APM_L7_IS_的定义
 *
 */
int jxbankagree_detect(Conntrack *p_st_conn
                , Apm_packet *p_st_packet);

/*!
 * JXBANKAGREE协议解析入口
 *
 * \param p_st_conn             (ct信息)
 * \param p_st_packet           (协议分析入力数据)
 * \param p_st_hash_report      (保存Frreport_data)
 *
 * \return 参照module.h中APM_L7_ANALYZE_的定义
 *
 */
int jxbankagree_analyze(Conntrack *p_st_conn
                , Apm_packet *p_st_packet
                , Frhash_header *p_st_hash_report);

/*!
 * 释放JXBANKAGREE private数据
 *
 * \param p_st_session_privajxbankagree_in        (JXBANKAGREE的私有信息)
 *
 * \return 0  失败\n
 *         1  成功
 *
 */
int jxbankagree_session_destory(void *p_st_session_privajxbankagree_in);

#endif
